package com.ccit.springbootlaw.utils;

/**
 * 线程本地变量工具类，提供线程安全的对象存储访问能力
 *
 * <p>通过静态ThreadLocal实例维护线程隔离的存储空间，支持泛型类型安全存取操作。
 * 适用于需要在同一线程中跨方法传递数据的场景。
 */
public class ThreadLocalUtil {
    // 使用泛型化ThreadLocal存储任意类型对象
    private static final ThreadLocal<Object> THREAD_LOCAL = new ThreadLocal<Object>();

    /**
     * 获取当前线程绑定的对象
     *
     * @param <T> 期望的返回类型（自动类型推断）
     * @return 当前线程关联的对象实例
     * @throws ClassCastException 当实际存储对象类型与期望类型不匹配时抛出
     */
    @SuppressWarnings("unchecked")
    public static <T> T get() {
        // 进行受控的类型转换，依赖调用方确保类型一致性
        return (T) THREAD_LOCAL.get();
    }

    /**
     * 绑定对象到当前线程
     *
     * @param value 要存储的对象实例（允许null值）
     */
    public static void set(Object value) {
        // 将对象与当前线程上下文关联
        THREAD_LOCAL.set(value);
    }

    /**
     * 清除当前线程绑定的对象
     *
     * <p>为防止内存泄漏，应在使用完毕后主动调用该方法清理资源
     */
    public static void remove() {
        // 移除当前线程关联对象
        THREAD_LOCAL.remove();
    }
}